package com.atguigu.mq.config;

import lombok.Data;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.transaction.RabbitTransactionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * RabbitConfig 配置类，用于配置 RabbitMQ 相关的bean
 * 通过使用 @Configuration 注解，指示该类是一个 Spring 配置类
 */
@Configuration
@Data
public class RabbitConfig {
    
    /**
     * 配置 RabbitTransactionManager，用于管理 RabbitMQ 的事务
     * 该方法通过接受一个 CachingConnectionFactory 对象作为参数，创建并返回一个 RabbitTransactionManager 实例
     *
     * @param connectionFactory RabbitMQ 的连接工厂，用于创建 RabbitTransactionManager
     * @return 创建的 RabbitTransactionManager 实例
     */
    @Bean
    public RabbitTransactionManager transactionManager(CachingConnectionFactory connectionFactory) {
        return new RabbitTransactionManager(connectionFactory);
    }
    
    /**
     * 配置 RabbitTemplate，用于发送和接收消息
     * 该方法通过接受一个 CachingConnectionFactory 对象作为参数，创建并返回一个 RabbitTemplate 实例
     *
     * @param connectionFactory RabbitMQ 的连接工厂，用于创建 RabbitTemplate
     * @return 创建的 RabbitTemplate 实例
     */
    @Bean
    public RabbitTemplate rabbitTemplate(CachingConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        // 设置是否在相同的通道上进行事务管理，以确保消息的可靠投递
        rabbitTemplate.setChannelTransacted(true);
        return rabbitTemplate;
    }
}
